package isg.etsii.ull.es;

import isg.etsii.ull.es.DAO.AnuncioDAO;
import isg.etsii.ull.es.DAO.PropiedadesDAO;
import isg.etsii.ull.es.DAO.UsuarioRegistradoDAO;

import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.sql.SQLException;
import java.util.ArrayList;

public class VenCom {
	/**
	 * @param args
	 */
	
	private static ArrayList<UsuarioRegistrado> listaUsuariosRegistrados = new ArrayList<UsuarioRegistrado>();
	private static boolean autenticado = false;
	//private static ArrayList<Propiedad> listaPropiedades = new ArrayList<Propiedad>();
	private static UsuarioRegistrado usuarioAutenticado = new UsuarioRegistrado();
	
	public static void main(String[] args) throws ClassNotFoundException, SQLException {
		// TODO Auto-generated method stub
		InputStreamReader isr = new InputStreamReader(System.in);
		BufferedReader br =  new BufferedReader(isr);
		VenCom vencom = new VenCom();
		String user = null;
		
		int opcion = 0;
		
		do {
			
			if (autenticado) {
				user = usuarioAutenticado.getNUsuario();
			}
			else {
				user = "invitado";
			}
			
			System.out.println("Usuario: " + user);
			System.out.println();
			System.out.println("******************************************************");
			System.out.println("*                    VenCom.Prop                     *");
			System.out.println("******************************************************");
			System.out.println("* Menu de opciones:                                  *");
			System.out.println("*      1. Registrarse                                *");
			System.out.println("*      2. Autenticarse                               *");
			System.out.println("*      3. Insertar Propiedad                         *");
			System.out.println("*      4. Buscar Propiedad                           *");
			System.out.println("*      5. Publicar un anuncio                        *");
			System.out.println("*      0. Salir                                      *");
			System.out.println("******************************************************");
			System.out.println();
			System.out.print("Elija una opcion: ");
			
			try {
				opcion = Integer.parseInt(br.readLine());
			} catch (IOException e) {
				// TODO Auto-generated catch block
				e.printStackTrace();
			} // try - catch
		   
			switch(opcion) {
				case 1:									
					vencom.Registrarse();
					
					vencom.Clear();
					
					break;
				  
				case 2:				
					if (autenticado) {
						   System.out.println();
						   System.out.println("Ya esta autenticado");
						   System.out.println();
						   System.out.print("�Desea desconectarse? (s/n): ");
							char car = 0;
							
							try {
								car = (char) System.in.read();
								
								br.readLine();
							} catch (IOException e) {
								// TODO Auto-generated catch block
								e.printStackTrace();
							}
							
							if (car == 's') {
								autenticado = false;
							} // if
							else {
								System.out.println();
							} // else
					}
					else {
						vencom.Autenticarse();
					}
					
					vencom.Clear();
					
					break;
				   
				case 3:					
					if (autenticado) {
						vencom.NuevaPropiedad();
					}
					else {
						VenCom.Opciones();	
					} // else
					
					vencom.Clear();
					
					break;
				   
				case 4:
					vencom.Busquedaprop();
					
					vencom.Clear();
					
					break;
					
				case 5:				
				    if (autenticado) {
					   vencom.PublicarAnuncio();
				    }
				    else {
					   VenCom.Opciones();
				    } // else
				    
				    vencom.Clear();
				    
				    break;
				    
				case 0:
					autenticado = false;
					
					vencom.Clear();
					
					break;
				   
				default:
					
					System.out.println();
					System.out.println("Opcion incorrecta");
					System.out.println();
					
					break;
					
			} //switch
		} while (opcion != 0);
	} // public static void
	
	public UsuarioRegistrado BuscarUsuarioRegistrado(String NUsuario) {
		UsuarioRegistrado usr = new UsuarioRegistrado();
		
		for (int i = 0; i < listaUsuariosRegistrados.size(); i++) { 
			usr = (UsuarioRegistrado)listaUsuariosRegistrados.get(i);
			
			if (NUsuario.equals(usr.getNUsuario())) {
				return usr;
			}
		} 
		
		UsuarioRegistrado usr2 = new UsuarioRegistrado();
		
		return usr2;
	}
	
	public void Clear() {
		for (int i=0; i<100;i++)
			System.out.println();
	}
	
	
	public void Registrarse() throws ClassNotFoundException, SQLException {	
		BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
		UsuarioRegistrado usr = new UsuarioRegistrado();
		UsuarioRegistradoDAO usrdao = new UsuarioRegistradoDAO();
		boolean correcto = false;
		
		System.out.println();
		System.out.println("Registrarse");
		System.out.println();
		
		do {
			do {
				System.out.print("Introduzca el nombre de usuario: ");
			
				try {
					usr.setNUsuario(br.readLine());
				} catch (IOException e1) {
					// TODO Auto-generated catch block
					e1.printStackTrace();
				}	
				
				if (usrdao.existe(usr.getNUsuario()) == 1) { 
					System.out.println();
					System.out.println("El nombre de usuario esta siendo usuado");
					System.out.println();
				} // if
				else {
					correcto = true;
				} // else
				
			} while(!correcto);
				
			correcto = false;
			
			try {
				System.out.print("Introduzca la contrasena: ");
				usr.setClave(br.readLine());
				System.out.print("Introduzca su nombre: ");
				usr.setNombre(br.readLine());
				System.out.print("Introduzca el dni: ");
				usr.setDNI(br.readLine());
			} catch (IOException e) {
				// TODO Auto-generated catch block
				e.printStackTrace();
			} // try - catch
			
			System.out.println();
			System.out.println("Informacion del nuevo usuario");
			System.out.println();
			
			usr.Mostrar();
			
			System.out.println();
			System.out.print("�Son correctos los datos? (s/n): ");
			
			char car = 0;
			
			try {
				car = (char) System.in.read();
				
				br.readLine();
			} catch (IOException e) {
				// TODO Auto-generated catch block
				e.printStackTrace();
			}
			
			if (car == 's') {
				correcto = true;
			} // if
			else {
				System.out.println();
			} // else
		} while(!correcto); // do - while
		
		if (usrdao.nuevo(usr) == 1) {
			System.out.println();
			System.out.println("Usuario registrado");
			System.out.println();
		} else {
			System.out.println("");
		}
	}

	public void Autenticarse() throws ClassNotFoundException, SQLException {
		BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
		UsuarioRegistradoDAO usrdao = new UsuarioRegistradoDAO();
		boolean correcto = false;	
		String user = null;
		String clave = null;
		VenCom vencom = new VenCom();
		
		System.out.println();
		System.out.println("Autenticarse");
		System.out.println();
		
		try {
			do {
				System.out.print("Introduzca el nombre de usuario: ");
				user = br.readLine();
				System.out.print("Introduzca la contrasena: ");
				clave = br.readLine();
				
				int existe = usrdao.existe(user);
				
				if (existe == 1) {
					int existeclave = usrdao.existeClave(user, clave);
					
					if (existeclave == 1) {
						autenticado = true;
						
						usuarioAutenticado = usrdao.buscarUsuario(user);
						
						correcto = true;
						
						System.out.println();
					}
					else {
						int opt = 0;
						
						System.out.println();
						System.out.println("La contrasena es incorrecta");
						
						do {
							System.out.println();
							System.out.println("Pulse:");
							System.out.println("  1. Para volverlo a intentar");
							System.out.println("  2. Para volver al inicio");
							System.out.println();
							System.out.print("Elija una opcion: ");
							
							opt = Integer.parseInt(br.readLine());
						
							switch(opt) {
								case 1:
									System.out.println();
									System.out.println("Usuario: " + user);
									System.out.print("Introduzca la contrasena: ");
										
									clave = br.readLine();
										
									existeclave = usrdao.existeClave(user, clave);
											
									if (existeclave == 1) {
										autenticado = true;
												
										usuarioAutenticado = usrdao.buscarUsuario(user);
												
										correcto = true;
												
										System.out.println();
									}
									else {
										System.out.println();
										System.out.println("La contrasena es incorrecta");
										
										opt = 4;
									}
						
									break;
						
								case 2:
									correcto = true;
							
									System.out.println();
							
									break;
						
								default:
									System.out.println();
									System.out.println("Opcion incorrecta");
							
									break;
							}
						} while ((opt < 1) || (opt > 2));
					} // else
				} // if
				else {
					int opt = 0;
					
					System.out.println();
					System.out.println("El usuario: " + user + " no existe en la base de datos");
					
					do {
						System.out.println();
						System.out.println("Pulse:");
						System.out.println("  1. Para volverlo a intentar");
						System.out.println("  2. Para registrase");
						System.out.println("  3. Para volver al inicio");
						System.out.println();
						System.out.print("Elija una opcion: ");
						
						opt = Integer.parseInt(br.readLine());
						
						switch(opt) {
							case 1:
								System.out.println();
							
								break;
						
							case 2:
						
								vencom.Registrarse();
							
								correcto = true;
						
								break;
						
							case 3:
								correcto = true;
								
								System.out.println();
								
								break;
							
							default:
								System.out.println();
								System.out.println("Opcion incorrecta");
								
								break;
						}
					} while ((opt < 1) || (opt > 3));
				}
			} while(!correcto);
		} catch(Exception e) {
			e.printStackTrace();
		}
	}
		
	public void NuevaPropiedad() throws ClassNotFoundException, SQLException {
		Propiedad prop = new Propiedad();
	   
		BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
	   
		System.out.println();
		System.out.println("Insertar propiedad");
		System.out.println();
	   
		try{	
			System.out.print("Introduzca el tipo de propiedad: ");
			prop.setTipoProp(br.readLine());
			prop.setDni(usuarioAutenticado.getDNI());
			System.out.print("Introduzca la direccion: ");
			prop.setDireccion(br.readLine());
			System.out.print("Introduzca el precio: "); 
			prop.setPrecio(Float.valueOf(br.readLine()));
		} catch(Exception e){
			e.printStackTrace();
		}
		System.out.println("Informacion de la nueva propiedad ");
		prop.Mostrar();
		PropiedadesDAO propDao = new PropiedadesDAO () ;
		propDao.nuevo(prop);
		
		ArrayList<Propiedad> listaPropiedades = new ArrayList<Propiedad>();
		listaPropiedades = propDao.listarTodos(usuarioAutenticado.getDNI());
		System.out.println("PROPIEDADES EN BD PARA EL USUARIO " + usuarioAutenticado.getNUsuario());
		for (int i = 0; i < listaPropiedades.size(); i++) { 
			prop = (Propiedad)listaPropiedades.get(i);
			prop.Mostrar();
		} 
		System.out.println();
		
	}

	public void PublicarAnuncio() throws ClassNotFoundException, SQLException {
		BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
	    Anuncio a = new Anuncio ();
	    
		System.out.println();
		System.out.println("Publicar Anuncio");
		System.out.println();
	   
		try{	
			a.setDni(usuarioAutenticado.getDNI());
			System.out.print("Id de propiedad: ");
			a.setIdPropiedad(Integer.parseInt(br.readLine()));
			System.out.print("Fecha inicial: ");
			a.setFInicial(br.readLine());
			System.out.print("Fecha final: ");
			a.setFFinal(br.readLine());
		} catch(Exception e){
			e.printStackTrace();
		}
		
		System.out.println("Informacion del Anuncio");
		a.Mostrar();
		AnuncioDAO aDao = new AnuncioDAO () ;
		aDao.nuevo(a);
		
		ArrayList<Anuncio> listaAnuncios = new ArrayList<Anuncio>();
		listaAnuncios = aDao.listarTodos(usuarioAutenticado.getDNI());
		System.out.println("ANUNCIOS EN BD PARA EL USUARIO " + usuarioAutenticado.getNUsuario());
		for (int i = 0; i < listaAnuncios.size(); i++) { 
			a = (Anuncio)listaAnuncios.get(i);
			a.Mostrar();
		} 
		System.out.println();
	}
	
	public void Busquedaprop() throws ClassNotFoundException, SQLException {
		// TODO Auto-generated method stub
		InputStreamReader isr = new InputStreamReader(System.in);
		BufferedReader br =  new BufferedReader(isr);
		//Anuncio a = new Anuncio ();
		Propiedad prop = new Propiedad();
		PropiedadesDAO prop1Dao = new PropiedadesDAO();
		
		System.out.println();
		System.out.println("Buscar propiedad");
		System.out.println();
		
		int opcion = 0;
		do {
		      System.out.println("Elija el campo sobre el que desea realizar la busqueda: ");
		      System.out.println("      1. Tipo de Propiedad                               ");
		      System.out.println("      2. Precio                                          ");
		      System.out.println();
		      System.out.println("Pulse 0 para salir de la busqueda                       ");
		      System.out.println("Elija una opcion: ");
		      
		      try {
					opcion = Integer.parseInt(br.readLine());
				} catch (NumberFormatException e) {
					// TODO Auto-generated catch block
					e.printStackTrace();
				} catch (IOException e) {
					// TODO Auto-generated catch block
					e.printStackTrace();
				}
				
		      switch(opcion) {
		      case 1:
		    	  try{
		    		  System.out.println();
		    		  System.out.print("Introduce el tipo de propiedad que desea: ");
		    		  prop.setTipoProp(br.readLine());
		    	  } catch(Exception e){
			  			e.printStackTrace();
			  		}
		  		
		  		ArrayList<Propiedad> listaPropiedades = new ArrayList<Propiedad>();
		  		listaPropiedades = prop1Dao.listartipo(prop.getTipoProp());
		  		System.out.println("PROPIEDADES EN BD PARA EL TIPO " + prop.getTipoProp());
		  		for (int i = 0; i < listaPropiedades.size(); i++) { 
		  			prop = (Propiedad)listaPropiedades.get(i);
		  			prop.Mostrar();
		  		} 
		  		System.out.println();
		  		
		  		break;
		  		
		      case 2:
		    	  try{
		    		  System.out.println();
		    		  System.out.print("Introduce el precio maximo: ");
		  			  prop.setPrecio(Float.valueOf(br.readLine()));
		    	  } catch(Exception e){
			  			e.printStackTrace();
			  		}
		  		
		  		listaPropiedades = prop1Dao.listarPrecio(prop.getPrecio());
		  		System.out.println("PROPIEDADES EN BD PARA EL TIPO " + prop.getPrecio());
		  		for (int i = 0; i < listaPropiedades.size(); i++) { 
		  			prop = (Propiedad)listaPropiedades.get(i);
		  			prop.Mostrar();
		  		} 
		  		System.out.println();
		  		
		  		break;
		      case 0: 
			     break;
		      default:
		      } //switch
		   } while (opcion != 0);
	} // public static void
	
	public static void Opciones()throws ClassNotFoundException, SQLException {
		int opt = 0;
		InputStreamReader isr = new InputStreamReader(System.in);
		BufferedReader br =  new BufferedReader(isr);
		VenCom vencom = new VenCom();
		System.out.println();
		System.out.println("El usuario: invitado no tiene privilegios para realizar esta accion");
		
		do {
			System.out.println();
			System.out.println("Pulse:");
			System.out.println("  1. Para autenticarse");
			System.out.println("  2. Para registrase");
			System.out.println("  3. Para volver al inicio");
			System.out.println();
			System.out.print("Elija una opcion: ");
			
			try {
				opt = Integer.parseInt(br.readLine());
			} catch (NumberFormatException e) {
				// TODO Auto-generated catch block
				e.printStackTrace();
			} catch (IOException e) {
				// TODO Auto-generated catch block
				e.printStackTrace();
			}
		
			switch(opt) {
				case 1:
					vencom.Autenticarse();
					
					break;
				  
				case 2:
					vencom.Registrarse();
					
					break;
		
				case 3:							
					System.out.println();
			
					break;
		
				default:
					System.out.println();
					System.out.println("Opcion incorrecta");
			
					break;
			}
		} while ((opt < 1) || (opt > 3));
	}
	
	public static void MostrarUSR() throws ClassNotFoundException, SQLException{
	   UsuarioRegistradoDAO usrdao = new UsuarioRegistradoDAO();
	   UsuarioRegistrado usr = new UsuarioRegistrado ();
		listaUsuariosRegistrados = usrdao.listarTodos();
		System.out.println("USUARIOS ALMACENADOS EN BD ");
		for (int i = 0; i < listaUsuariosRegistrados.size(); i++) { 
			usr = (UsuarioRegistrado)listaUsuariosRegistrados.get(i);
			usr.Mostrar();
		} 
		System.out.println();
	
	}
	
}
